package ru.inse.core.domain;



/**
 * Суперкласс для всех сущностей имеющих ID
 */
public class BaseEntity
{
    private Long id;

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    @Override
    public boolean equals(Object o)
    {
        //проверка на один и тотже экзампляр объекта
        if (this == o)
        {
            return true;
        }
        // проверка на соответствие класов
        if ((o == null) || (o.getClass() != this.getClass()))
        {
            return false;
        }
        return true;
    }

    /**
     * Метод для переопределения, служит для добавления
     * наследниками своих полей в буффер из которого генерируется строк для toString().
     * Для удобства можно использовать метод addFieldToStringBuffer
     *
     * @param sb
     */
    protected void addCustomFieldForToString(StringBuilder sb)
    {
        //do nothing
    }

    static protected void addFieldToStringBuffer(StringBuilder sb, String fieldName, Object value)
    {
        sb.append(", ").append(fieldName).append(":").append(value);
    }

    @Override
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName()).append("[").append("id:").append(getId());
        addCustomFieldForToString(sb);
        sb.append("]");
        return sb.toString();
    }

    /**
     * Вспомогательный метод для генерирования hash code.
     * Вызывается для набора полей сущности, на основе которых можно судить - один и тот же ли экземпляр класса
     *
     * @param accumulateTo результат от предыдущего вызова метода
     * @param obj          значение поля
     * @return накопленный hash code
     */
    protected static int accumulateHashCode(int accumulateTo, Object obj)
    {
        return 31 * accumulateTo + (obj == null ? 0 : accumulateTo + obj.hashCode());
    }

    protected static boolean equals(Object a, Object b)
    {
        if (a == null || b == null)
        {
            return false;
        }
        return a.equals(b);
    }
}
